package com.example.spmusic.media
import android.content.res.AssetManager
import android.media.MediaPlayer
import android.util.Log
import java.io.IOException

private const val TAG = "Music"//用于日志记录
private const val MUSIC_FLODER = "music_sounds"
class MusicPlayer (private val assets:AssetManager){
    val musics:List<Music> = handleMusic()
    private val mediaPlay = MediaPlayer()
    //读取音频文件封装为对象返回
    private fun handleMusic():List<Music>{
        val musicNames :Array<String>
        val musicArrays = mutableListOf<Music>()
        try {
            //获取资源文件下所有文件名称
            musicNames = assets.list(MUSIC_FLODER)?: emptyArray()
            if (musicNames.isEmpty()) {
                //提示未找到资源
                return emptyList()
            }

            musicNames.forEach { filename ->
                val assetPath = "$MUSIC_FLODER/$filename"
                val music = Music(assetPath)
                // loadingMusic(music)
                musicArrays.add(music)
            }
        } catch (e:IOException){
            //提示
            Log.e(TAG, "handleMusic: 未找到资源", e)
        }
        return musicArrays
    }

    //播放音频
    fun playMusic(music: Music){
        //从资源文件中打开指定目录文件，返回文件描述符和文件范围信息
        try {
            val assetFileDescriptor = assets.openFd(music.assetPath)
            mediaPlay.reset()  //重置播放器
            //告诉播放器要播放那个文件，使用文件描述符和偏移长度
            mediaPlay.setDataSource(
                assetFileDescriptor.fileDescriptor,//访问文件描述的底层描述符
                assetFileDescriptor.startOffset,//文件中音频数据开始的位置偏移量
                assetFileDescriptor.length)//文件中音频数据的长度即字节数

            mediaPlay.prepare()//准备播放，同步阻塞，加载音频
            mediaPlay.start()
        }catch (e:IOException){
            //提示
            Log.e(TAG, "playMusic: 播放失败，请检查配置", e)
        }

    }

    //释放资源
    fun release(){
        mediaPlay.release()
    }
}